package net.cassite.daf4j.ds;

import net.cassite.daf4j.*;

/**
 * 表达式解释器
 *
 * @param <Context> 上下文类型
 */
public interface ExpressionParser<Context, BasicElement> extends AdvancedParser<Context, BasicElement> {
        /**
         * 解释 加 表达式
         *
         * @param context 上下文
         * @param a       第一个加数
         * @param b       第二个加数
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement add(Context context, Object a, Object b) throws Exception;

        /**
         * 解释 减 表达式
         *
         * @param context 上下文
         * @param a       被减数
         * @param b       减数
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement minus(Context context, Object a, Object b) throws Exception;

        /**
         * 解释 乘 表达式
         *
         * @param context 上下文
         * @param a       第一个乘数
         * @param b       第二个乘数
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement multi(Context context, Object a, Object b) throws Exception;

        /**
         * 解释 除 表达式
         *
         * @param context 上下文
         * @param a       被除数
         * @param b       除数
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement divide(Context context, Object a, Object b) throws Exception;

        /**
         * 解释 MOD 表达式
         *
         * @param context 上下文
         * @param a       被模数
         * @param b       模数
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement mod(Context context, Object a, Object b) throws Exception;

        /**
         * 解释 求和 表达式
         *
         * @param context 上下文
         * @param data    求和字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement sum(Context context, DataComparable<?> data) throws Exception;

        /**
         * 解释 平均数 表达式
         *
         * @param context 上下文
         * @param data    求平均数字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement avg(Context context, DataComparable<?> data) throws Exception;

        /**
         * 解释 计数 表达式
         *
         * @param context 上下文
         * @param data    计数字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement count(Context context, DataComparable<?> data) throws Exception;

        /**
         * 解释 计数 表达式
         *
         * @param context 上下文
         * @param entity  实体
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement count(Context context, Object entity) throws Exception;

        /**
         * 解释 求最大值 表达式
         *
         * @param context 上下文
         * @param data    求最大值字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement max(Context context, DataComparable<?> data) throws Exception;

        /**
         * 解释 求最小值 表达式
         *
         * @param context 上下文
         * @param data    求最小值字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement min(Context context, DataComparable<?> data) throws Exception;

        /**
         * 解释 存在 表达式
         *
         * @param context  上下文
         * @param subQuery 子查询
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement exists(Context context, PreResult<?> subQuery) throws Exception;

        /**
         * 解释 不存在 表达式
         *
         * @param context  上下文
         * @param subQuery 子查询
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement notExists(Context context, PreResult<?> subQuery) throws Exception;

        /**
         * 解释 求负 表达式
         *
         * @param context 上下文
         * @param param   求负数的参数
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement unary_negative(Context context, ParameterComparable<?> param) throws Exception;

        /**
         * 解释 拼接字符串 表达式
         *
         * @param context 上下文
         * @param data    第一个字符串(字段)
         * @param str     第二个字符串
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement concat(Context context, IData<String> data, String str) throws Exception;

        /**
         * 解释 拼接字符串 表达式
         *
         * @param context 上下文
         * @param str     第一个字符串
         * @param data    第二个字符串(字段)
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement concat(Context context, String str, IData<String> data) throws Exception;

        /**
         * 解释 拼接字符串 表达式
         *
         * @param context 上下文
         * @param data1   第一个字符串(字段)
         * @param data2   第二个字符串(字段)
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement concat(Context context, IData<String> data1, IData<String> data2) throws Exception;

        /**
         * 解释 取子串 表达式
         *
         * @param context 上下文
         * @param data    字符串字段
         * @param start   起始位置
         * @param end     结束位置
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement substring(Context context, IData<String> data, int start, int end) throws Exception;

        /**
         * 解释 trim 表达式
         *
         * @param context 上下文
         * @param data    字符串字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement trim(Context context, IData<String> data) throws Exception;

        /**
         * 解释 转小写 表达式
         *
         * @param context 上下文
         * @param data    字符串字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement lower(Context context, IData<String> data) throws Exception;

        /**
         * 解释 转大写 表达式
         *
         * @param context 上下文
         * @param data    字符串字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement upper(Context context, IData<String> data) throws Exception;

        /**
         * 解释 取长度 表达式
         *
         * @param context 上下文
         * @param data    字符串字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement length(Context context, IData<String> data) throws Exception;

        /**
         * 解释 取位置 表达式
         *
         * @param context 上下文
         * @param data    被查询串(字段)
         * @param str     查询串
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement locate(Context context, IData<String> data, String str) throws Exception;

        /**
         * 解释 取位置 表达式
         *
         * @param context 上下文
         * @param data1   被查询串(字段)
         * @param data2   查询串(字段)
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement locate(Context context, IData<String> data1, IData<String> data2) throws Exception;

        /**
         * 解释 取位置 表达式
         *
         * @param context 上下文
         * @param str     被查询串
         * @param data    查询串(字段)
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement locate(Context context, String str, IData<String> data) throws Exception;
}
